package book.nettyinaction.ch06;

import io.netty.channel.ChannelHandler;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;

/**
 * 代码清单 6-11 @Sharable 的错误用法
 *
 * 这段代码的问题在于它拥有状态，即用于跟踪方法调用次数的实例变量 count 。
 * 将这个类的一个实例添加到 ChannelPipeline 将极有可能在它被多个并发的 Channel 访问时导致问题。
 *  |- 当然，这个简单的问题可以通过将 channelRead() 方法变为同步方法来修正。
 *  |- 或者，使用 `AtomicInteger`
 *
 * 总之，只应该在确定了你的 ChannelHandler 是线程安全的时候才使用 @Sharable 注解。
 *
 */
@ChannelHandler.Sharable
public class UnsharableHandler extends ChannelInboundHandlerAdapter {
    private int count;

    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {

        // 将 count 字段的值加 1
        count ++;
        System.out.println( "channelRead(...) called the " + count + " time");

        // 记录方法调用并转发给下一个 ChannelHandler
        ctx.fireChannelRead( msg );
    }
}
